﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Triangle
{
    class Program
    {
        static void Main(string[] args)
        {
            /*new Map(new[]
                        {
                            new[] {0, 0, 1, 1, 1, 0},
                            new[] {0, 1, 1, 1, 1, 1},
                            new[] {0, 1, 1, 0, 1, 1},
                            new[] {0, 1, 1, 1, 1, 1},
                            new[] {0, 0, 1, 1, 1, 0},
                            new[] {0, 0, 0, 0, 0, 0},
                            new[] {0, 0, 0, 0, 0, 0}
                        });
            */
            new Map(new[]
                        {
                            new[] {0, 0, 1, 1, 1, 0},
                            new[] {0, 1, 0, 0, 1, 0},
                            new[] {0, 1, 0, 0, 1, 0},
                            new[] {0, 1, 0, 0, 0, 1},
                            new[] {0, 0, 1, 1, 1, 0},
                            new[] {0, 0, 0, 0, 0, 0},
                            new[] {0, 0, 0, 0, 0, 0}
                        });
            //new Map(new[]
            //            {
            //                new[] {1, 1, 1, 0, 0, 0},
            //                new[] {1, 0, 1, 0, 0, 0},
            //                new[] {1, 0, 1, 0, 0, 0},
            //                new[] {1, 1, 1, 0, 0, 0},
            //                new[] {0, 0, 0, 0, 1, 1},
            //                new[] {0, 0, 0, 0, 1, 1},
            //                new[] {0, 0, 0, 0, 1, 1}
            //            });
            /*var srch = new Search(new Node(1, 0));
            srch.Dfs(new Node(1, 1), new Node(1, 0));
            var cc = new ConnectedComponent(srch.Stack);
            var corners = cc.GetCorner();
            Console.WriteLine("Corners:");
            foreach (var corner in corners)
                Console.WriteLine(corner);
            Map.Paint(srch.Stack.ToList(), false);
            //не работает, видимо из-за того что 4 шарп
            *///Console.WriteLine("Not painted: " + Map.Find() ?? "Таких нет");

            //Console.WriteLine(cc.IsTriangle(corners));
            Node goal;
            var pureCount = 0;
            var dirtyCount = 0;
            while ((goal = Map.Find()) != null)
            {
                var srch = new Search(goal);
                if (goal.GetNode(Map.GetValueNode(goal)).Count == 0)
                {
                    Map.Paint(new List<Node> { goal }, false);
                    continue;
                }
                srch.Dfs(goal.GetNode(Map.GetValueNode(goal))[0], goal);
                Map.Paint(srch.Stack.ToList(), false);
                var cc = new ConnectedComponent(srch.Stack);
                if (cc.IsTriangle(cc.GetCorner()))
                    if (cc.IsPure)
                        pureCount++;
                    else
                        dirtyCount++;
            }
            Console.WriteLine("Find {0} tringles", pureCount * 6 + dirtyCount);
        }
    }
}
